home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************
-
- LaunchIPC.c
-
- Makes launching your own IPC_process so easy like possible
- (are we not all lazy ... ? ;) ). You does not need to declare
- any functions "__saveds" and/or "__asm" to launch a new process,
- this is all here done.
-
- You must have a global memorypool called "mempool" to use this
- like it is (, else you must change it a little bit...).
-
- The only thing you have to do, is to copy the prototype of
- LaunchIPC() ...
-
- *********************************************************************/
-
- #include "includes/LaunchIPC.h"
-
- /********************************************************************/
- // this you should declare in your other files
-
- extern BOOL __saveds LaunchIPC( void (*func_entry)(), APTR data, IPCData **saveto, STRPTR proc_name, ULONG stack );
-
- // arguments:
- // func_entry - your new process entry point...
- // your function must be the type "void name( IPCData *ipc, APTR data )"
- // and does reveive also its own IPC pointer as argument
- // data - any data you want to have as argument for your new process
- // but keep in mind that this data remains valid long enough...
- // saveto - a pointer to save the IPCData of the new process (must be supplied !)
- // proc_name - name of the process name to create
- // stack - stack size to use for the new process (if NULL -> default 4096)
-
- // the function does return TRUE on success
-
- /********************************************************************/
- // local prototypes
-
- void __saveds Func_Startup( void );
-
- ULONG __asm __saveds startup_startup( register __a0 IPCData *ipc,
- register __a1 StartupData *cd );
-
- /********************************************************************/
- // all stuff is really simple, but it may save a lot of work,
- // especially if you need more than one process.
-
- // this function does allocate some memory and launches the new process
-
- BOOL __saveds LaunchIPC( void (*func_entry)(), APTR data, IPCData **saveto, STRPTR proc_name, ULONG stack )
- {
- StartupData *sd;
-
- if( (sd = AllocMemH( mempool, sizeof(StartupData))) )
- {
- sd->a4 = getreg( REG_A4 );
- sd->module = (struct Library *) getreg( REG_A6 );
- sd->library = DOpusBase;
- sd->entry = func_entry;
- sd->data = data;
-
- if( !stack )
- stack = 4096;
-
- IPC_Launch( 0, saveto, proc_name,
- (ULONG) Func_Startup, stack,
- (ULONG) sd, DOSBase );
-
- if( saveto )
- return TRUE;
-
- FreeMemH( sd );
- }
-
- return FALSE;
- }
-
- void __saveds Func_Startup( void )
- {
- struct Library *DOpusBase;
- IPCData *ipc;
- StartupData *sd;
-
- if (!(DOpusBase=(struct Library *)FindName(&((struct ExecBase *)*((ULONG *)4))->LibList,"dopus5.library")))
- return;
-
- ipc = IPC_ProcStartup( (ULONG *) &sd, startup_startup);
-
- putreg( REG_A4, sd->a4 );
-
- if( ipc )
- {
- sd->module->lib_OpenCnt++;
-
- sd->entry( ipc, sd->data ); // starting your function
-
- sd->module->lib_OpenCnt--;
- }
-
- IPC_Free( sd->ipc );
- FreeMemH( sd );
- return;
- }
-
- ULONG __asm __saveds startup_startup( register __a0 IPCData *ipc,
- register __a1 StartupData *sd )
- {
- struct Library *DOpusBase;
-
- putreg( REG_A4, sd->a4 );
- sd->ipc = ipc;
- DOpusBase = sd->library; // does produce a warning here...
-
- return TRUE;
- }
-